package com.learning.spring.ioc.bean.xml.manager;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * ClassName: BeanManager
 * Description: Bean 的基本配置
 * 1、构造函数定义
 * 2、静态工厂方法
 * 3、实例化工厂类
 * Date: 2018/7/26 9:49 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class BeanManager {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }


    /**
     * 装配一个 Bean: <Bean> 标签
     * <bean name="managerBean" class="com.learning.spring.ioc.bean.xml.manager.ManagerBean"/>
     * 1. Bean 的名字：
     * - id，xml 的特殊属性，有一些限制，且是唯一的
     * - name，可以使用一些特殊字符，而且可以不唯一，但是后面会覆盖前一个
     * - 不指定，默认是全限定类名
     * <p>
     * 2. Bean 的类名，对应的实现类
     * <p>
     * Bean 的命名
     */
    static void test() {
    }


    /**
     * Bean 的装配方式
     * 1. 构造函数装配
     * 2. 静态工厂方法装配
     * 3. 非静态方法装配
     */
    static void test1() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");

        // 根据Bean 的名字获取 （DL-依赖查找）
        ManagerBean managerBean = (ManagerBean) context.getBean("managerBean");
        managerBean.save();

        // 根据Bean 的名字与类型获取
        ManagerBean managerBean2 = context.getBean("managerBean", ManagerBean.class);
        managerBean2.save();

        // 根据Bean 类型获取
        ManagerBean managerBean3 = context.getBean(ManagerBean.class);
        managerBean3.save();
    }

    /**
     * 静态工厂方法实例化Bean
     */
    static void test2() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        ManagerBean personService2 = context.getBean("personService2", ManagerBean.class);
        personService2.save();
    }

    /**
     * 非静态方法的调用，需先实例化工厂类。
     * factory-bean 和 factory-method
     */
    static void test3() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        ManagerBean personService2 = context.getBean("personService3", ManagerBean.class);
        personService2.save();
    }

}
